このページはECMAScript® 2020 Language SpecificationB Additional ECMAScript Features for Web Browsers章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

ECMAScriptホストがWebブラウザーである場合、この付録で定義されているECMAScript言語の構文とセマンティクスが必要です。 この付録の内容は規範的ですが、ECMAScriptホストがWebブラウザーでない場合はオプションです。

この付録では、WebブラウザベースでのECMAScript実装のレガシー機能と他の特性について説明しています。 この付録で指定されているすべての言語機能と動作には、1つ以上の望ましくない特性があり、レガシーの使用法がない場合はこの仕様から削除されています。 ただし、多くの既存のWebページでこれらの機能が使用されているということは、Webブラウザーがこれらの機能を引き続きサポートする必要があるということを意味します。 この付録の仕様は、これらのレガシー機能の相互運用可能な実装の要件を定義しています。

これらの機能は、ECMAScript言語コアの一部ではありません。 プログラマーは、新しくECMAScriptコードを作成する際に、これらの機能や動作を使用しないでください。 実装は、Webブラウザーの一部であるか、レガシーECMAScriptコードを実行する必要がある場合を除いて、これらの機能を実装することをお勧めしません。

B.1 追加構文(Additional Syntax)

B.1.1 Numeric Literals

11.8.3の構文とセマンティクスは次のように拡張されます。ただし、この拡張はstrictモードコード では許可されていません。

構文:

NonOctalDigit :: one of

89

B.1.1.1 静的セマンティクス(Static Semantics)

B.1.2 文字列リテラル(String Literals)

11.8.4の構文とセマンティクスは次のように拡張されます。ただしこの拡張はstrictモードコード では許可されていません。

構文:

ZeroToThree :: one of

0123

FourToSeven :: one of

4567

EscapeSequenceの定義は、strictモードまたはTemplateCharacter の解析では使用されません。

B.1.2.1 静的セマンティクス(Static Semantics)

B.1.3 HTMLライクコメント(HTML-like Comments)

11.4の構文とセマンティクスは次のように拡張されます。ただしゴールシンボル Moduleを使用してソースコードを解析する場合、この拡張は許可されません。

構文:

Comment ::

MultiLineComment
SingleLineHTMLOpenComment
SingleLineHTMLCloseComment
SingleLineDelimitedComment

MultiLineComment ::

/*FirstCommentLineopt LineTerminator MultiLineCommentCharsopt */HTMLCloseCommentopt

FirstCommentLine ::

SingleLineDelimitedCommentChars

SingleLineHTMLOpenComment ::

SingleLineHTMLCloseComment ::

LineTerminatorSequence HTMLCloseComment

SingleLineDelimitedComment ::

/*SingleLineDelimitedCommentCharsopt */

HTMLCloseComment ::

WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt -->SingleLineCommentCharsopt

SingleLineDelimitedCommentChars ::

SingleLineNotAsteriskChar SingleLineDelimitedCommentCharsopt
*SingleLinePostAsteriskCommentCharsopt

SingleLineNotAsteriskChar ::

SourceCharacter but not one of * or LineTerminator

SingleLinePostAsteriskCommentChars ::

SingleLineNotForwardSlashOrAsteriskChar SingleLineDelimitedCommentCharsopt
*SingleLinePostAsteriskCommentCharsopt

SingleLineNotForwardSlashOrAsteriskChar ::

SourceCharacter but not one of / or * or LineTerminator

WhiteSpaceSequence ::

WhiteSpace WhiteSpaceSequenceopt

SingleLineDelimitedCommentSequence ::

SingleLineDelimitedComment WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt

行末コードポイントを含むMultiLineCommentと同様に、SingleLineHTMLCloseCommentは、構文文法による解析の目的でLineTerminatorと見なされます。

B.1.4 正規表現パターン(Regular Expressions Patterns)

21.2.1の構文は、次のように変更および拡張されます。 これらの変更は、文法プロダクションの順序とコンテキスト情報によって解消されるあいまいさをもたらします。 次の文法を使用して解析する場合、各代替案は、以前のプロダクション代替案が一致しない場合にのみ考慮されます。

この代替パターンの文法とセマンティクスは、BMPパターンの構文とセマンティクスのみを変更します。 次の文法拡張には、[U]パラメーターでパラメーター化されたプロダクションが含まれています。 ただし、これらの拡張機能はいずれも、ゴールシンボルにある[U]パラメーターで解析するときに認識されるUnicodeパターンの構文を変更しません。

構文:

Term[U, N] ::

[+U]Assertion[+U, ?N]
[+U]Atom[+U, ?N]
[+U]Atom[+U, ?N] Quantifier
[~U]Assertion[~U, ?N]
[~U]ExtendedAtom[?N]

Assertion[U, N] ::

^
$
\b
\B
[+U](?=Disjunction[+U, ?N] )
[+U](?!Disjunction[+U, ?N] )
(?<=Disjunction[?U, ?N] )
(?<!Disjunction[?U, ?N] )

QuantifiableAssertion[N] ::

(?=Disjunction[~U, ?N] )
(?!Disjunction[~U, ?N] )

ExtendedAtom[N] ::

.
\AtomEscape[~U, ?N]
\[lookahead = c]
(Disjunction[~U, ?N] )
(?:Disjunction[~U, ?N] )

ExtendedPatternCharacter ::

SourceCharacter but not one of ^$\.*+?()[|

AtomEscape[U, N] ::

[~U]DecimalEscape but only if the CapturingGroupNumber of DecimalEscape is <= _NcapturingParens_
[+N]kGroupName[?U]

SourceCharacterIdentityEscape[N] ::

[~N]SourceCharacter but not c
[+N]SourceCharacter but not one of c or k

ClassAtomNoDash[U, N] ::

SourceCharacter but not one of \ or ] or -
\ClassEscape[?U, ?N]
\[lookahead = c]
[+U]と[~U]の両方で同じ左辺が発生する場合は、明確化の優先順位を制御する必要があります。

B.1.4.1 静的セマンティクス: 早期エラー(Static Semantics: Early Errors)

21.2.1.1のセマンティクスは次のように拡張されます。

  • ソーステキストがこのルールに一致する場合は、構文エラー
  • 最初または2番目の ClassAtomIsCharacterClasstrue で、 このプロダクションに[U]パラメーターがあるなら、構文エラー
  • ClassAtomNoDash または ClassAtomIsCharacterClasstrue で、このプロダクションに[U]パラメーターがあるなら、構文エラー

B.1.4.2 静的セマンティクス(Static Semantics): IsCharacterClass

21.2.1.3のセマンティクスは次のように拡張されます

  1. false を返す

 

B.1.4.3 静的セマンティクス(Static Semantics): CharacterValue

21.2.1.4のセマンティクスは次のように拡張されます

  1. U+005C (REVERSE SOLIDUS) コードポイント値を返す
  1. ClassControlLetter に一致するコードポイントを ch とする
  2. ch の コードポイント値 を i とする
  3. i を32で割った余りを返す
  1. LegacyOctalEscapeSequence (B.1.2 ) の SV を評価して、 コードユニット cu を取得する
  2. cu の数値を返す

B.1.4.4 パターンセマンティクス(Pattern Semantics)

21.2.2のセマンティクスは次のように拡張されます。

21.2.2.5の次の参照は、

次の二つの意味があると解釈されます。

Term(21.2.2.5)には、次の追加の評価ルールが含まれます。

次のプロダクションは、以下のアルゴリズムで評価します。

は、

と同じように評価されます。

ただし Atom の代わりに QuantifiableAssertion が使用されます。

は、

と同じように評価されます。

ただし Atom の代わりに ExtendedAtom が使用されます。

は、

と同じように評価されます。

ただし Atom の代わりに ExtendedAtom が使用されます。

Assertion(21.2.2.6)には、次の追加の評価ルールが含まれます。

は、次のように評価されます。

  1. QuantifiableAssertion 評価して、 Matcher m を取得する
  2. m を返す

と、

のアサーション(21.2.2.6)評価ルールは、QuantifiableAssertion にも使用されます。ただし、QuantifiableAssertionAssertion の代わりに使用されます。

を除くAtomプロダクションのAtom(21.2.2.8)評価ルールも ExtendedAtom プロダクションに使用されます。ただし、ExtendedAtomAtom の代わりに使用されます。パラメータdirectionを含む次の評価ルールも追加されます。

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 単一の文字 \ U+005C (REVERSE SOLIDUS) を含むCharSetA とする
  2. CharacterSetMatcher(A, false, direction) を呼び出し、結果の Matcher を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ExtendedPatternCharacter であらわさせる文字を ch とする
  2. ch を含む1要素のCharSetA とする
  3. CharacterSetMatcher(A, false, direction) を呼び出し、結果の Matcher を返す

CharacterEscape (21.2.2.10) には、次の追加の評価ルールが含まれます。

次のプロダクションは、以下のアルゴリズムで評価します。

  1. CharacterEscapeCharacterValuecv とする
  2. 文字値が cv の文字を返す

NonemptyClassRanges(21.2.2.15)は、次の評価ルールを変更します。

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 最初の ClassAtom 評価して、 CharSet A を取得する
  2. 2番目の ClassAtom 評価して、 CharSet B を取得する
  3. ClassRanges 評価して、 CharSet C を取得する
  4. CharacterRangeOrUnion(A, B) をコールし、その結果の CharSet を D とする
  5. CharSets DC の和集合を返す

NonemptyClassRangesNoDash(21.2.2.16)は、次の評価ルールを変更します。

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassAtomNoDash 評価して、 CharSet A を取得する
  2. ClassAtom 評価して、 CharSet B を取得する
  3. ClassRanges 評価して、 CharSet C を取得する
  4. CharacterRangeOrUnion(A, B) をコールし、その結果の CharSetD とする
  5. CharSets DC の和集合を返す

ClassEscape(21.2.2.19)には、次の追加の評価ルールが含まれます

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassEscapeCharacterValuecv とする
  2. 文字値が cv の文字を c とする
  3. 単一の文字 c を含むCharSetを返す

ClassAtomNoDash(21.2.2.18)には、次の追加の評価ルールが含まれます

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 単一の文字 \ U+005C (REVERSE SOLIDUS) を含むCharSetを返す
このプロダクションには、許容可能な制御文字が後に続かない文字クラス内のシーケンス\cからのみ到達できます。
B.1.4.4.1 ランタイムセマンティクス(Runtime Semantics): CharacterRangeOrUnion ( A, B )

抽象操作CharacterRangeOrUnionは、2つのCharSetパラメーターAおよびBを取り、次の手順を実行します。

  1. Unicodefalse なら、
    1. A または B に含まれている文字が一文字だけでないなら、
      1. 単一文字 U+002D (HYPHEN-MINUS) を C とする
      2. CharSet A と BC の和集合を返す
  2. CharacterRange(A, B) を返す

B.2 追加組み込みプロパティ(Additional Built-in Properties)

ECMAScriptホストがWebブラウザーの場合、標準の組み込みオブジェクトに次のプロパティが追加されます。

B.2.1 グローバルオブジェクトの追加プロパティ(Additional Properties of the Global Object)

表85のエントリが表8に追加されます。

表85: 既知組み込みオブジェクト(追加)
組み込み名 グローバル名 ECMAScript言語との関係
%escape% escape escape関数(B.2.1.1)
%unescape% unescape unescape関数(B.2.1.2)

B.2.1.1 escape ( string )

escape関数は、グローバルオブジェクトのプロパティです。 特定のコード単位を16進エスケープシーケンスに置き換えた文字列値を計算します。

値が0x00FF以下のコードユニットには、%xx形式の2桁のエスケープシーケンスが使用されます。 0x00FFより大きいコードユニットは、%uxxxxの形式の4桁のエスケープシーケンスが使用されます。

escape関数は、%escape%組み込みオブジェクトです。 この関数が引数stringで呼び出されると、次の手順が実行されます。

  1. ? ToString(string) を string にセットする
  2. string のコードユニット数を length とする
  3. empty String を R とする
  4. 0 を k とする
  5. klength の間繰り返し
    1. string のインデックス k の コードユニット (16ビットの符号なし整数として表される) を char とする
    2. char"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./" のどれかなら、
      1. 単一のコードユニット char を含む文字列値を S とする
    3. b. と異なり、 char ≧ 256 なら、
      1. char の数値を n とする
      2. 以下の文字連結を S とする
        • "%u"
        • 4桁の大文字の16進数(0埋め)としてフォーマットした、nの文字列表現
    4. c. と異なるなら、
      1. Assert: char < 256
      2. char の数値を n とする
      3. 以下の文字連結を S とする
        • "%"
        • 2桁の大文字の16進数(0埋め)としてフォーマットした、nの文字列表現
    5. RS の文字連結を R にセットする
    6. k + 1 を k にセットする
  6. R を返す
エンコーディングの一部はRFC1738で説明されているエンコーディングに基づいています。ただし、この標準で指定されているエンコーディング全体は、RFC1738の内容に関係なく、上記で説明されています。このエンコーディングは、RFC3986によって行われたRFC1738への変更を反映していません。

B.2.1.2 unescape ( string )

unescape関数は、グローバルオブジェクトのプロパティです。 escape関数によって変換された各エスケープシーケンスを、コードユニットに置き換えます。

unescape関数は、%unescape%組み込みオブジェクトです。 unscape関数が引数stringで呼び出されると、次の手順が実行されます。

  1. ? ToString(string) を string にセットする
  2. string のコードユニット数を length とする
  3. empty String を R とする
  4. 0 を k とする
  5. klength の間繰り返し
    1. k within string の インデックス k のコードユニットを c とする
    2. c が コードユニット 0x0025 (PERCENT SIGN) なら、
      1. klength - 6 で、 stringのインデックス k + 1 のコードユニットが 0x0075(LATIN SMALL LETTER U)で、k + 2 から k + 5 の4文字が全て16進数なら、
        1. string の インデックス k + 2 から k + 5 の4文字を整数値にし、対応するコードユニットを c にセットする
        2. k + 5 を k にセットする
      2. i. と異なり、 klength - 3 で、 string の インデックス k + 1 と k + 2 の2文字が16進数なら、
        1. "00" の後に string の インデックス k + 1 と k + 2 をつなげた4文字を整数値にし、対応するコードユニットを c にセットする
        2. k + 2 を k にセットする
    3. Rc の文字連結を R にセットする
    4. k + 1 を k にセットする
  6. R を返す

B.2.2 Object.prototypeオブジェクトの追加プロパティ(Additional Properties of the Object.prototype Object)

B.2.2.1 Object.prototype.__proto__

Object.prototype.__proto__は、属性{ [[Enumerable]]: false, [[Configurable]]: true }を持つアクセサプロパティです。

[[Get]]属性と[[Set]]属性は以下のように定義されています。

B.2.2.1.1 get Object.prototype.__proto__

[[Get]]属性の値は、引数を必要としない組み込み関数です。 次の手順を実行します。

  1. ? ToObject(this値) を O とする
  2. ? O.[[GetPrototypeOf]]() を返す
B.2.2.1.2 set Object.prototype.__proto__

[[Set]]属性の値は、引数protoを受け取る組み込み関数です。 次の手順を実行します。

  1. ? RequireObjectCoercible(this値) を O とする
  2. Type(proto) が Object型 または Null でないなら、 undefined を返す
  3. Type(O) が Object型 でないなら、 undefined を返す
  4. ? O.[[SetPrototypeOf]](proto) を status とする
  5. statusfalse なら、TypeError例外をスローする
  6. undefined を返す

B.2.2.2 Object.prototype.__defineGetter__ ( P, getter )

__defineGetter__ メソッドが引数 Pgetter で呼び出されると、次の手順が実行されます。

  1. ? ToObject(this値) を O とする
  2. IsCallable(getter) が false なら、TypeError例外をスローする
  3. プロパティ記述子 { [[Get]]: getter, [[Enumerable]]: true, [[Configurable]]: true } を desc とする
  4. ? ToPropertyKey(P) を key とする
  5. ? DefinePropertyOrThrow(O, key, desc) を実行する
  6. undefined を返す

B.2.2.3 Object.prototype.__defineSetter__ ( P, setter )

__defineSetter__ メソッドが引数 Psetter で呼び出されると、次の手順が実行されます。

  1. ? ToObject(this値) を O とする
  2. IsCallable(setter) が false なら、TypeError例外をスローする
  3. プロパティ記述子 { [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: true } を desc とする
  4. ? ToPropertyKey(P) を key とする
  5. ? DefinePropertyOrThrow(O, key, desc) を実行する
  6. undefined を返す

B.2.2.4 Object.prototype.__lookupGetter__ ( P )

__lookupGetter__ メソッドが引数 P で呼び出されると、次の手順が実行されます。

  1. ? ToObject(this値) を O とする
  2. ? ToPropertyKey(P) を key とする
  3. 繰り返し
    1. ? O.[[GetOwnProperty]](key) を desc とする
    2. descundefined でないなら、
      1. IsAccessorDescriptor(desc) が true なら、 desc.[[Get]] を返す
      2. undefined を返す
    3. ? O.[[GetPrototypeOf]]() を O にセットする
    4. Onull なら、 undefined を返す

B.2.2.5 Object.prototype.__lookupSetter__ ( P )

__lookupSetter__ メソッドが引数 P で呼び出されると、次の手順が実行されます。

  1. ? ToObject(this値) を O とする
  2. ? ToPropertyKey(P) を key とする
  3. 繰り返し
    1. ? O.[[GetOwnProperty]](key) を desc とする
    2. descundefined でないなら、
      1. IsAccessorDescriptor(desc) が true なら、 desc.[[Set]] を返す
      2. undefined を返す
    3. ? O.[[GetPrototypeOf]]() を O にセットする
    4. Onull なら、 undefined を返す

B.2.3 String.prototypeオブジェクトの追加プロパティ(Additional Properties of the String.prototype Object)

B.2.3.1 String.prototype.substr ( start, length )

substrメソッドは、startlengthの2つの引数を取り、thisオブジェクトを文字列に変換した結果から部分文字列を返します。部分文字列は、インデックスstartから、長さ lengthのコード単位です(lengthが定義されていない場合は文字列の終わりまで)。 startが負の場合、sourceLength + startとして扱われます。ここで、sourceLengthは文字列の長さです。 結果はString値であり、Stringオブジェクトではありません。 次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToInteger(start) を intStart とする
  4. lengthundefined なら、 +∞ を、異なるなら ? ToInteger(length) を end とする
  5. S のコードユニット数を size とする
  6. intStart < 0 なら max(size + intStart, 0) を intStart にセットする
  7. min( max(end, 0), size - intStart) を resultLength とする
  8. resultLength ≦ 0 なら empty String を返す
  9. S のインデックス intStart から長さ resultLength の連続コードユニットを含む文字列値を返す

Note

substr 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

B.2.3.2 String.prototype.anchor ( name )

anchor メソッドが引数 name で呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "a", "name", name) を返す
B.2.3.2.1 ランタイムセマンティクス(Runtime Semantics): CreateHTML ( string, tag, attribute, value )

抽象操作CreateHTMLは、引数stringtagattributevalueを使用して呼び出されます。 tagattributeは文字列値である必要があります。 次の手順が実行されます。

  1. ? RequireObjectCoercible(string) を str とする
  2. ? ToString(str) を S とする
  3. "<"tag の文字連結を p1 とする
  4. attributeempty String でないなら、
    1. ? ToString(value) を V とする
    2. V 内のコードユニット0x0022を、""" に置き換え、その結果を escapedV とする
    3. 次の文字連結を p1 にセットする
      • p1
      • コードユニット 0x0020 (SPACE)
      • attribute
      • コードユニット 0x003D (EQUALS SIGN)
      • コードユニット 0x0022 (QUOTATION MARK)
      • escapedV
      • コードユニット 0x0022 (QUOTATION MARK)
  5. p1">" の文字連結を p2 とする
  6. p2S の文字連結を p3 とする
  7. p3"</"tag">" の文字連結を p4 とする
  8. p4 を返す

B.2.3.3 String.prototype.big ( )

bigメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "big", "", "") を返す

blinkメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "blink", "", "") を返す

B.2.3.5 String.prototype.bold ( )

boldメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "b", "", "") を返す

B.2.3.6 String.prototype.fixed ( )

fixedメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "tt", "", "") を返す

B.2.3.7 String.prototype.fontcolor ( color )

fontcolorメソッドが引数colorで呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "font", "color", color) を返す

B.2.3.8 String.prototype.fontsize ( size )

fontsizeメソッドが引数sizeで呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "font", "size", size) を返す

B.2.3.9 String.prototype.italics ( )

italicsメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "i", "", "") を返す

linkメソッドが引数urlで呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "a", "href", url) を返す

B.2.3.11 String.prototype.small ( )

smallメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "small", "", "") を返す

B.2.3.12 String.prototype.strike ( )

strikeメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "strike", "", "") を返す

B.2.3.13 String.prototype.sub ( )

subメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "sub", "", "") を返す

B.2.3.14 String.prototype.sup ( )

supメソッドが呼び出されると、次の手順が実行されます。

  1. this値 を S とする
  2. ? CreateHTML(S, "sup", "", "") を返す

B.2.3.15 String.prototype.trimLeft ( )

"trimLeft"プロパティは、主に古いコードとの互換性のために提供されています。 新しいECMAScriptコードでは"trimStart"プロパティを使用することをお勧めします。

"trimLeft"プロパティの初期値は、String.prototype.trimStartプロパティの初期値と同じ関数オブジェクトです。

B.2.3.16 String.prototype.trimRight ( )

"trimRight"プロパティは、主に古いコードとの互換性のために提供されています。 新しいECMAScriptコードでは"trimEnd"プロパティを使用することをお勧めします。

"trimRight"プロパティの初期値は、String.prototype.trimEndプロパティの初期値と同じ関数オブジェクトです。

B.2.4 Date.prototypeオブジェクトの追加プロパティ(Additional Properties of the Date.prototype Object)

B.2.4.1 Date.prototype.getYear ( )

getFullYearメソッドは、「2000年問題」を回避するため、ほぼすべての目的に適しています。

getYearメソッドが引数なしで呼び出されると、次の手順が実行されます。

  1. ? thisTimeValue(this値) を t とする
  2. tNaN なら、 NaN を返す
  3. YearFromTime( LocalTime(t)) - 1900 を返す

B.2.4.2 Date.prototype.setYear ( year )

setFullYearメソッドは、「2000年問題」を回避するため、ほぼすべての目的に適しています。

setYearメソッドが引数 year で呼び出されると、次の手順が実行されます。

  1. ? thisTimeValue(this値) を t とする
  2. tNaN なら +0 を、異なるなら LocalTime(t) を t にセットする
  3. ? ToNumber(year) を y とする
  4. yNaN なら、
    1. NaNthisのDateオブジェクト の [[DateValue]] 内部スロット にセットする
    2. NaN を返す
  5. ! ToInteger(y) を yi とする
  6. 0 ≦ yi ≦ 99 なら yi + 1900 を yyyy とする
  7. 6. と異なるなら、 yyyyy とする
  8. MakeDay(yyyy, MonthFromTime(t), DateFromTime(t)) を d とする
  9. UTC( MakeDate(d, TimeWithinDay(t))) を date とする
  10. TimeClip(date) を thisのDateオブジェクト の [[DateValue]] 内部スロット にセットする
  11. thisのDateオブジェクト の [[DateValue]] 内部スロットの値を返す

B.2.4.3 Date.prototype.toGMTString ( )

"toGMTString"プロパティは、主に古いコードとの互換性のために提供されています。 新しいECMAScriptコードでは"toUTCString"プロパティを使用することをお勧めします。

Date.prototype.toGMTStringの初期値は、Date.prototype.toUTCStringの初期値である関数オブジェクトと同じです。

B.2.5 RegExp.prototypeオブジェクトの追加プロパティ(Additional Properties of the RegExp.prototype Object)

B.2.5.1 RegExp.prototype.compile ( pattern, flags )

compile メソッドが引数 patternflags で呼び出されると、次の手順が実行されます。

  1. this値 を O とする
  2. Type(O) が Object型でない、または O に [[RegExpMatcher]] 内部スロットがないなら、
    1. TypeError例外をスローする
  3. Type(pattern) が Object型 で pattern に [[RegExpMatcher]] 内部スロットがあるなら、
    1. flagsundefined でないなら、TypeError例外をスローする
    2. pattern.[[OriginalSource]] を P とする
    3. pattern.[[OriginalFlags]] を F とする
  4. 3. と異なるなら、
    1. patternP とする
    2. flagsF とする
  5. ? RegExpInitialize(O, P, F) を返す
compileメソッドは、thisオブジェクトRegExpを新しいパターンとフラグで完全に再初期化します。 このメソッドが使用されたとき結果のRegExpオブジェクトが複数回使用されることから、実装は、追加最適化候補であるというアサーションとして解釈する場合があります。

B.3 その他の追加機能(Other Additional Features)

B.3.1 __proto__オブジェクトイニシャライザーのプロパティ名(__proto__ Property Names in Object Initializers)

12.2.6.1のルールに、次の早期エラールールが追加されます。 ObjectAssignmentPatternが必要なコンテキストでObjectLiteralがあらわれる場合、早期エラールールは適用されません。 さらに、CoverParenthesizedExpressionAndArrowParameterListまたはCoverCallExpressionAndAsyncArrowHeadを最初に解析するときには適用されません。

PropertyNameListによって返されるリストには、ComputedPropertyNameを使用するように定義された文字列リテラルプロパティ名は含まれていません。

12.2.6.8の次のプロダクションは、

次の定義に置き換えられます。

  1. PropertyName の評価結果を propKey とする
  2. ReturnIfAbrupt(propKey)
  3. propKey が 文字列値 "__proto__" で、 IsComputedPropertyKey(PropertyName ) が false なら、
    1. trueisProtoSetter とする
  4. 3. と異なるなら、
    1. falseisProtoSetter とする
  5. IsAnonymousFunctionDefinition(AssignmentExpression ) が true で、 isProtoSetterfalse なら、
    1. 引数 propKey を使用して AssignmentExpressionNamedEvaluationpropValue とする
  6. 5. と異なるなら、
    1. AssignmentExpression の評価結果を exprValueRef とする
    2. ? GetValue(exprValueRef) を propValue とする
  7. isProtoSettertrue なら、
    1. Type(propValue) が Object型 か Null なら、
      1. object.[[SetPrototypeOf]](propValue) を返す
    2. NormalCompletion(empty) を返す
  8. Assert: enumerabletrue
  9. Assert: object 構成不可能なプロパティがない、拡張可能な通常のオブジェクト
  10. ! CreateDataPropertyOrThrow(object, propKey, propValue) を返す

B.3.2 ラベル付き関数宣言(Labelled Function Declarations)

ECMAScript2015より前は、LabelledStatementの仕様では、ステートメントラベルをFunctionDeclarationに関連付けることができませんでした。しかし、ラベル付きのFunctionDeclaration非strictコードで許容される拡張のため、ほとんどのブラウザーでホストされるECMAScript実装で、その拡張をサポートしていました。ECMAScript2015では、LabelledStatementの文法プロダクションで、LabelledItemとしてFunctionDeclarationを使用できるようになりました。ただし、構文エラーが発生したときに生成される早期エラールールが含まれています(13.13.1)。Webブラウザーの互換性のために、そのルールは強調表示されたテキストを追加して変更されています。

  • strictモードコードのソースコードがこのルールに一致するなら、構文エラー
WithStatementIfStatementIterationStatementの初期エラー規則により、これらのステートメントに、非strictコード でラベル付けされたFunctionDeclarationを含めることができません。

B.3.3 ブロックレベル関数宣言Webレガシー互換性セマンティクス(Block-Level Function Declarations Web Legacy Compatibility Semantics)

ECMAScript2015より前は、FunctionDeclarationBlockステートメントのStatementListの要素として定義していませんでした。ただし、その形式のFunctionDeclarationのサポートは許容される拡張のため、ほとんどのブラウザーでホストされるECMAScript実装で使用できました。しかし、セマンティクスは実装間で異なっています。この違いのため、Blockレベルの関数宣言を使用する既存のWeb ECMAScriptコードは、ブラウザー実装のセマンティックが同じ場合にのみ、ブラウザー実装間で移植可能です。以下は、その共通部分のセマンティクスに該当するユースケースです。

  1. 宣言された関数は、単一のブロック内でのみ参照されるケース
    • BindingIdentifierが名前fである1つ以上のFunctionDeclarationは、それを囲む関数gのコード内で発生し、その宣言はBlock内にネストされます。
    • var宣言ではないfの他の宣言は、gの関数コード内では発生しません。
    • IdentifierReferenceとしてのfのすべての出現は、fの宣言を含むBlockStatementList内にあります。
  2. 宣言された関数は、単一のBlock内で使用される可能性がありますが、同じBlock内に含まれていない内部関数定義によっても参照されるケース
    • BindingIdentifierが名前fである1つ以上のFunctionDeclarationは、囲んでいる関数gのコード内にあり、その宣言はBlock内にネストされています。
    • var宣言ではないfの他の宣言は、gの関数コード内では発生しません。
    • fの宣言を含むブロックのStatementList内に、IdentifierReferenceとしてfが出現することがあります。
    • g内にネストされている別の関数h内にIdentifierReferenceとしてfが少なくとも1つあり、fの他の宣言がh内からのfへの参照を隠してしていません。
    • hのすべての呼び出しは、fの宣言が評価された後に発生します。
  3. 宣言された関数は、単一のブロック内と、後続のブロック内でも参照されるケース
    • BindingIdentifierが名前fである1つ以上のFunctionDeclarationは、それを囲む関数gのコード内で発生し、その宣言がBlock内にネストされます。
    • var宣言ではないfの他の宣言は、gの関数コード内では発生しません。
    • fの宣言を含むBlockStatementList内に、IdentifierReferenceとしてfが出現することがあります。
    • fの宣言を含むBlockにレキシカル的に続くgのコード内に、IdentifierReferenceとしてfが1つ以上あります。

最初のユースケースは、ECMAScript2015によって提供されるBlockレベル関数宣言のセマンティクスと相互運用可能です。このユースケースを使用する既存のECMAScriptコードは、この第91314章で定義されたBlockレベル関数宣言セマンティクスを使用して動作します。

2番目と3番目のユースケースのECMAScript2015の相互運用性には、91418.2.1、および15.1.1のセマンティクスに対する次に示す拡張が必要です。

ECMAScript実装に診断警告メッセージを報告するメカニズムがあるという前提で、これらの互換性セマンティクスが適用されるFunctionDeclarationがコードに含まれていて、非互換性セマンティクスと動作が異なる場合、警告を出す必要があります。たとえば、varバインディングが導入されていない場合、その導入によって早期エラーが発生する可能性があるため、警告メッセージは生成されません。

B.3.3.1 FunctionDeclarationInstantiationの変更内容(Changes to FunctionDeclarationInstantiation)

FunctionDeclarationInstantiationのステップ29で、次のステップが実行されます。

  1. strictfalse なら、
    1. Block または CaseClause または DefaultClauseStatementList 内に直接含まれている FunctionDeclarationf とし、各 f ごとに次を実行する
      1. fBindingIdentifierStringValueF とする
      2. fBindingIdentifierとしてFを持つVariableStatementに置き換えても、funcの早期エラーが生成されず、FparameterNamesの要素ではないなら、
        1. NOTE: Fのvarバインディングが、VarDeclaredName、仮パラメーターの名前、別のFunctionDeclarationのいずれでもない場合にのみ、ここでインスタンス化される
        2. initializedBindingsF が含まれず、 F"arguments" でないなら、
          1. ! varEnvRec.CreateMutableBinding(F, false) を実行する
          2. varEnvRec.InitializeBinding(F, undefined) を実行する
          3. instantiatedVarNamesF を追加する
        3. fの評価時、FunctionDeclaration Evaluationアルゴリズム(14.1.25)の代わりに次の手順を実行する
          1. 実行中の実行コンテキストVariableEnvironmentfenv とする
          2. fenvEnvironmentRecordfenvRec とする
          3. 実行中の実行コンテキストLexicalEnvironmentbenv とする
          4. benvEnvironmentRecordbenvRec とする
          5. ! benvRec.GetBindingValue(F, false) を fobj とする
          6. ! fenvRec.SetMutableBinding(F, fobj, false) を実行する
          7. NormalCompletion(empty) を返す

B.3.3.2 GlobalDeclarationInstantiationの変更内容(Changes to GlobalDeclarationInstantiation)

GlobalDeclarationInstantiationのステップ14は次のステップが実行されます。

  1. scriptIsStrictstrict とする
  2. strictfalse なら、
    1. 空の新規ListdeclaredFunctionOrVarNames とする
    2. declaredFunctionNames の要素を declaredFunctionOrVarNames に追加する
    3. declaredVarNames の要素を declaredFunctionOrVarNames に追加する
    4. script に含まれる Block または CaseClause または DefaultClauseStatementList に直接含まれる FunctionDeclarationf とし、各 f ごとに次を実行する
      1. fBindingIdentifierStringValueF とする
      2. fBindingIdentifier として F を持つ VariableStatement に置き換えても、scriptの早期エラーが発生しないなら
        1. envRec.HasLexicalDeclaration(F) が false なら、
          1. ? envRec.CanDeclareGlobalVar(F) を fnDefinable とする
          2. fnDefinabletrue なら、
            1. NOTE: Fのvarバインディングは、VarDeclaredNameまたは別のFunctionDeclarationの名前でない場合にのみ、ここでインスタンス化される
            2. declaredFunctionOrVarNamesF が含まれていないなら、
              1. ? envRec.CreateGlobalVarBinding(F, false) を実行する
              2. declaredFunctionOrVarNamesF を追加する
            3. fのを評価時、FunctionDeclaration Evaluation アルゴリズム(14.1.25)の代わりに次の手順を実行する
              1. 実行中の実行コンテキストVariableEnvironmentgenv とする
              2. genvEnvironmentRecordgenvRec とする
              3. 実行中の実行コンテキストLexicalEnvironmentbenv とする
              4. benvEnvironmentRecordbenvRec とする
              5. ! benvRec.GetBindingValue(F, false) を fobj とする
              6. ? genvRec.SetMutableBinding(F, fobj, false) を実行する
              7. NormalCompletion(empty) を返す

B.3.3.3 EvalDeclarationInstantiationの変更内容(Changes to EvalDeclarationInstantiation)

EvalDeclarationInstantiationのステップ9で次のステップが実行されます。

  1. strictfalse なら、
    1. 空の新規ListdeclaredFunctionOrVarNames とする
    2. declaredFunctionNames の要素を declaredFunctionOrVarNames に追加する
    3. declaredVarNames の要素を declaredFunctionOrVarNames に追加する
    4. body 内に含まれる Block または CaseClause または DefaultClauseStatementList に直接含まれる FunctionDeclarationfとし、各 f ごとに次を実行する
      1. fBindingIdentifier StringValueF とする
      2. fBindingIdentifier として F を持つ VariableStatement の置き換えても body の早期エラーが生成されないなら、
        1. falsebindingExists とする
        2. lexEnvthisLex とする
        3. Assert: 次のループは終了する
        4. thisLexvarEnv が同じでない間繰り返し
          1. thisLexEnvironmentRecordthisEnvRec とする
          2. thisEnvRecオブジェクト環境レコード でないなら、
            1. thisEnvRec.HasBinding(F) が true なら、
              1. truebindingExists とする
          3. thisLex外部環境参照thisLex にセットする
        5. bindingExistsfalse で、 varEnvRecグローバル環境レコード なら、
          1. varEnvRec.HasLexicalDeclaration(F) が false なら、
            1. ? varEnvRec.CanDeclareGlobalVar(F) を fnDefinable とする
          2. a. と異なるなら、
            1. falsefnDefinable とする
        6. 5. と異なるなら、
          1. truefnDefinable とする
        7. bindingExistsfalse で、 fnDefinabletrue なら、
          1. declaredFunctionOrVarNamesF が含まれていないなら、
            1. varEnvRecグローバル環境レコード なら、
              1. ? varEnvRec.CreateGlobalVarBinding(F, true) を実行する
            2. i. と異なるなら、
              1. varEnvRec.HasBinding(F) を bindingExists とする
              2. bindingExistsfalse なら、
                1. ! varEnvRec.CreateMutableBinding(F, true) を実行する
                2. ! varEnvRec.InitializeBinding(F, undefined) を実行する
            3. declaredFunctionOrVarNamesF を追加する
          2. f の評価時、 FunctionDeclaration Evaluation(14.1.25) アルゴリズムの代わりに次の手順を実行する
            1. 実行中の実行コンテキストVariableEnvironmentgenv とする
            2. genvEnvironmentRecordgenvRec とする
            3. 実行中の実行コンテキストLexicalEnvironmentbenv とする
            4. benvEnvironmentRecordbenvRec とする
            5. ! benvRec.GetBindingValue(F, false) を fobj とする
            6. ? genvRec.SetMutableBinding(F, fobj, false) を実行する
            7. NormalCompletion(empty) を返す

B.3.3.4 Blockの静的セマンティック:早期エラーの変更内容(Changes to Block Static Semantics: Early Errors)

Webブラウザーの互換性のために、このルールは強調表示されたテキストを追加して変更しています。

  • このプロダクションに一致するソースコードがstrictモードコードではなく、重複エントリがFunctionDeclarationsによってのみバインドされているという条件を除き、StatementListLexicallyDeclaredNamesに重複エントリが含まれていると構文エラー

B.3.3.5 Statementの静的セマンティック:早期エラーの変更内容(Changes to switch Statement Static Semantics: Early Errors)

Webブラウザーの互換性のために、このルールは強調表示されたテキストを追加して変更しています。

SwitchStatement : switch(Expression )CaseBlock
  • このプロダクションに一致するソースコードがstrictモードコードではなく、重複エントリがFunctionDeclarationsによってのみバインドされているという条件を除き、CaseBlockLexicallyDeclaredNamesに重複エントリが含まれていると構文エラー

B.3.3.6 BlockDeclarationInstantiationの変更内容(Changes to BlockDeclarationInstantiation)

BlockDeclarationInstantiationのステップ4.a.ii.1はステップが実行されます。

  1. envRec.HasBinding(dn) が false なら、
    1. ! envRec.CreateMutableBinding(dn, false) を実行する

BlockDeclarationInstantiationのステップ4.b.iiiはステップが実行されます。

  1. envRec.HasBinding(fn) が false なら、
    1. envRec.InitializeBinding(fn, fo) を実行する
  2. 2. と異なるなら、
    1. Assert: dFunctionDeclaration
    2. envRec.SetMutableBinding(fn, fo, false) を実行する

B.3.4 IfStatementステートメント句のFunctionDeclarations

以下は、13.6IfStatementプロダクションを拡張します。

IfStatement[Yield, Await, Return] :

if(Expression[+In, ?Yield, ?Await] )FunctionDeclaration[?Yield, ?Await, ~Default] elseStatement[?Yield, ?Await, ?Return]
if(Expression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return] elseFunctionDeclaration[?Yield, ?Await, ~Default]
if(Expression[+In, ?Yield, ?Await] )FunctionDeclaration[?Yield, ?Await, ~Default] elseFunctionDeclaration[?Yield, ?Await, ~Default]
if(Expression[+In, ?Yield, ?Await] )FunctionDeclaration[?Yield, ?Await, ~Default]

このプロダクションは、非strictコードを解析する場合にのみ適用されます。このプロダクションに一致するコードは、FunctionDeclaration[?Yield, ?Await, ~Default]に一致するコードが、ソースコード内のその位置を占めるBlockStatementの唯一のStatementListItemであるかのように処理されます。このような合成BlockStatementのセマンティクスには、B.3.3 で指定されているWebレガシー互換性セマンティクスが含まれます。

B.3.5 Catch BlocksのVariableStatements(VariableStatements in Catch Blocks)

13.15.1は、次のように置き換えられます。

Catch 句の Blockには、CatchParameterによってバインドされる名前をバインドするvar宣言が含まれる場合があります。 実行時に、このようなバインディングはVariableDeclarationEnvironmentでインスタンス化されます。 これらは、CatchParameterによって導入された同じ名前のバインディングをシャドウイングしないため、そのようなvar宣言のイニシャライザーは、varバインディングではなく、対応するcatchパラメーターに割り当てます。

この変更された動作は、Catch 句の Blockに含まれるダイレクトeval呼び出しによって導入されたvarおよび関数宣言にも適用されます。 この変更は、18.2.1.3のアルゴリズムを次のように変更することで実現されます。

ステップ5.d.ii.2.a.iを、次のように置き換えます。

  1. thisEnvRecCatch 句の 環境レコード ではないなら、SyntaxError例外をスローする

ステップ9.d.ii.4.b.i.iを、次のように置き換えます。

  1. thisEnvRecCatch 句の 環境レコード ではないなら、 truebindingExists とする

B.3.6 ForInステートメントヘッドのイニシャライザー(Initializers in ForIn Statement Heads)

以下は、13.7IterationStatementプロダクションを拡張します。

IterationStatement[Yield, Await, Return] :

for(varBindingIdentifier[?Yield, ?Await] Initializer[~In, ?Yield, ?Await] inExpression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]

このプロダクションは、非strictコードを解析する場合にのみ適用されます。

13.7.5.3ContainsDuplicateLabelsの静的セマンティクスは、次のように拡張されます。

  1. 引数 labelSet を使用して StatementContainsDuplicateLabels を返す

13.7.5.4ContainsUndefinedBreakTargetの静的セマンティクスは、次のように拡張されます。

  1. 引数 labelSet を使用して StatementContainsUndefinedBreakTarget を返す

13.7.5.5ContainsUndefinedContinueTargetの静的セマンティクスは、次のように拡張されます。

  1. 引数 iterationSet« » を使用して StatementContainsUndefinedContinueTarget を返す

13.7.5.6IsDestructuringの静的セマンティクスは、次のように拡張されます。

  1. false を返す

13.7.5.7VarDeclaredNamesの静的セマンティクスは、次のように拡張されます。

  1. BindingIdentifierBoundNamesnames とする
  2. StatementVarDeclaredNames の要素を names に追加する
  3. names を返す

13.7.5.8VarScopedDeclarationsの静的セマンティクスは、次のように拡張されます。

  1. Listcontaining BindingIdentifierdeclarations とする
  2. StatementVarScopedDeclarations の要素を declarations に追加する
  3. declarations を返す

13.7.5.11LabelledEvaluationの静的セマンティクスは、次のように拡張されます。

  1. BindingIdentifierStringValuebindingId とする
  2. ? ResolveBinding(bindingId) を lhs とする
  3. IsAnonymousFunctionDefinition(Initializer ) が true なら、
    1. 引数 bindingId を使用して InitializerNamedEvaluationvalue とする
  4. 13. と異なるなら、
    1. Initializer の評価結果を rhs とする
    2. ? GetValue(rhs) を value とする
  5. ? PutValue(lhs, value) を実行する
  6. ? ForIn/OfHeadEvaluation(« », Expression , enumerate) を keyResult とする
  7. ? ForIn/OfBodyEvaluation(BindingIdentifier , Statement , keyResult, enumerate, varBinding, labelSet) を返す

B.3.7 [[IsHTMLDDA]]内部スロット(The [[IsHTMLDDA]] Internal Slot)

[[IsHTMLDDA]]内部スロットは、実装定義のオブジェクトに存在する可能性があります。 [[IsHTMLDDA]]内部スロットを持つオブジェクトは、ToBooleanおよび抽象等値比較抽象演算undefinedのように動作し、typeof演算子のオペランドとして使用されます。

[[IsHTMLDDA]]内部スロットを持つオブジェクトは、この仕様では作成されません。 ただし、Webブラウザのdocument.allはこのスロットを持つホスト作成のエキゾチックオブジェクトで、Web互換性の目的で存在します。 このタイプのオブジェクトの他の例はありません。document.allを除いて、実装では作成しないでください。

B.3.7.1 ToBooleanの変更点(Changes to ToBoolean)

表10で、Argumentの型がObjectのとき、変換結果は、次のアルゴリズムに置き換えられます。

  1. argument が [[IsHTMLDDA]] 内部スロット を持っているなら false を返す
  2. true を返す

B.3.7.2 抽象等値比較の変更点(Changes to Abstract Equality Comparison)

抽象等値比較アルゴリズムのステップ3の後に、次の手順が挿入されます。

  1. Type(x) が Object型で x に [[IsHTMLDDA]] 内部スロットがあり ynull または undefined なら、 true を返す
  2. xnull または undefinedType(y) が Object型で yに [[IsHTMLDDA]] 内部スロットがあるなら、 true を返す

B.3.7.3 typeof演算子の変更点(Changes to the typeof Operator)

次のテーブルエントリは、表35の「Object ([[Call]]あり)」の前に挿入されます。

表86: typeof演算の結果(追加)
val の型 結果
Object ([[IsHTMLDDA]]内部スロットあり) "undefined"